#ifndef __TEST_OVERRIDE_H__
#define __TEST_OVERRIDE_H__

#define TYPE_ONE          (one_get_type())
#define ONE(p)            (IM_TYPE_INSTANCE_CHECK_CAST((p),TYPE_ONE,One))
#define CONST_ONE(p)      (IM_TYPE_INSTANCE_CHECK_CAST_CONST((p),TYPE_ONE,One))
#define ONE_CLASS(c)      (IM_TYPE_CLASS_CHECK_CAST((c),TYPE_ONE,OneClass))
#define IS_ONE(p)         (IM_TYPE_INSTANCE_CHECK_TYPE((p),TYPE_ONE))
#define IS_ONE_CLASS(c)   (IM_TYPE_CLASS_CHECK_TYPE((c),TYPE_ONE))
#define ONE_GET_CLASS(p)  (IM_TYPE_INSTANCE_GET_CLASS_CAST((p),TYPE_ONE,OneClass))

#define TYPE_TWO          (two_get_type())
#define TWO(p)            (IM_TYPE_INSTANCE_CHECK_CAST((p),TYPE_TWO,Two))
#define CONST_TWO(p)      (IM_TYPE_INSTANCE_CHECK_CAST_CONST((p),TYPE_TWO,Two))
#define TWO_CLASS(c)      (IM_TYPE_CLASS_CHECK_CAST((c),TYPE_TWO,TwoClass))
#define IS_TWO(p)         (IM_TYPE_INSTANCE_CHECK_TYPE((p),TYPE_TWO))
#define IS_TWO_CLASS(c)   (IM_TYPE_CLASS_CHECK_TYPE((c),TYPE_TWO))
#define TWO_GET_CLASS(p)  (IM_TYPE_INSTANCE_GET_CLASS_CAST((p),TYPE_TWO,TwoClass))

#define TYPE_THREE         (three_get_type())
#define THREE(p)           (IM_TYPE_INSTANCE_CHECK_CAST((p),TYPE_THREE,Three))
#define CONST_THREE(p)     (IM_TYPE_INSTANCE_CHECK_CAST_CONST((p),TYPE_THREE,Three))
#define THREE_CLASS(c)     (IM_TYPE_CLASS_CHECK_CAST((c),TYPE_THREE,ThreeClass))
#define IS_THREE(p)        (IM_TYPE_INSTANCE_CHECK_TYPE((p),TYPE_THREE))
#define IS_THREE_CLASS(c)  (IM_TYPE_CLASS_CHECK_TYPE((c),TYPE_THREE))
#define THREE_GET_CLASS(p) (IM_TYPE_INSTANCE_GET_CLASS_CAST((p),TYPE_THREE,ThreeClass))

#define TYPE_FOUR         (four_get_type())
#define FOUR(p)           (IM_TYPE_INSTANCE_CHECK_CAST((p),TYPE_FOUR,Four))
#define CONST_FOUR(p)     (IM_TYPE_INSTANCE_CHECK_CAST_CONST((p),TYPE_FOUR,Four))
#define FOUR_CLASS(c)     (IM_TYPE_CLASS_CHECK_CAST((c),TYPE_FOUR,FourClass))
#define IS_FOUR(p)        (IM_TYPE_INSTANCE_CHECK_TYPE((p),TYPE_FOUR))
#define IS_FOUR_CLASS(c)  (IM_TYPE_CLASS_CHECK_TYPE((c),TYPE_FOUR))
#define FOUR_GET_CLASS(p) (IM_TYPE_INSTANCE_GET_CLASS_CAST((p),TYPE_FOUR,FourClass))

typedef struct _One         One;
typedef struct _OneClass    OneClass;
typedef struct _Two         Two;
typedef struct _TwoClass    TwoClass;
typedef struct _Three       Three;
typedef struct _ThreeClass  ThreeClass;
typedef struct _Four        Four;
typedef struct _FourClass   FourClass;

struct _One
{
    IMObject object;
};

struct _OneClass
{
    IMObjectClass parent_class;

    void    (*foo)     (IMPointer obj);
};

struct _Two
{
    One one;
};

struct _TwoClass
{
    OneClass parent_class;
};

struct _Three
{
    Two two;
};

struct _ThreeClass
{
    TwoClass parent_class;

    void (*bar) (IMPointer obj);
};

struct _Four
{
    Three three;
};

struct _FourClass
{
    ThreeClass parent_class;
};

IMType      one_get_type    ();
One*        one_new         ();
void        one_foo         (IMPointer obj);

IMType      two_get_type    ();
Two*        two_new         ();

IMType      three_get_type  ();
Three*      three_new       ();
void        three_bar       (IMPointer obj);

IMType      four_get_type   ();
Four*       four_new        ();

#endif

/*
vi:ts=4:nowrap:ai:expandtab
*/
